#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void* Routine(void* arg)
{
	while (1){
		printf("new  thread tid: %p\n", pthread_self());
		sleep(1);
	}
}
int main()
{
	pthread_t tid;
	pthread_create(&tid, NULL, Routine, NULL);
	while (1){
		printf("main thread tid: %p\n", pthread_self());
		sleep(2);
	}
	return 0;
}


// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	pthread_detach(pthread_self());
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 3){
// 		printf("%s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 	}
// 	pthread_exit((void*)6666);
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 3; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	while (1){
// 		printf("main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 		sleep(1);
// 	}
// 	return 0;
// }


// #include <pthread.h>
// #include <stdio.h>
// #include <unistd.h>

// void* child_thread(void* arg) {
//     while (1) {
//         printf("子线程运行中...\n");
//         sleep(1);
//     }
//     return NULL;
// }
// int main() {
//     pthread_t tid;
//     pthread_create(&tid, NULL, child_thread, NULL);
    
//     // 主线程被取消
//     pthread_cancel(pthread_self());
    
//     // 主线程退出前等待子线程（实际不会执行到这里）
//     pthread_join(tid, NULL);
//     return 0;
// }

// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// pthread_t main_thread;

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5){
// 		sleep(1);
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		count++;
// 		pthread_cancel(main_thread);
// 	}
// 	pthread_exit((void*)6666);
// }
// int main()
// {
// 	main_thread = pthread_self();
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 	for (int i = 0; i < 5; i++){
// 		void* ret = NULL;
// 		pthread_join(tid[i], &ret);
// 		printf("thread %d[%lu]...quit, exitcode: %d\n", i, tid[i], (int)ret);
// 	}
// 	return 0;
// }


// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// // void* Routine(void* arg)
// // {
// // 	char* msg = (char*)arg;	
// // 	while(true){
// // 	printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());	
// // 	pthread_cancel(pthread_self());
// // 	}
// // 	pthread_exit((void*)6666);
	
// // }
// int main()
// {
// 	int n = 10;
// 	while(n--)
// 	{
// 	printf("tid is %d \n", pthread_self());
// 	}
// 	pthread_cancel(pthread_self());
// 	return 0;
// }



// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 	}
// 	pthread_exit((void*)6666);
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 	for (int i = 0; i < 5; i++){
// 		void* ret = NULL;
// 		pthread_join(tid[i], &ret);
// 		printf("thread %d[%lu]...quit, exitcode: %d\n", i, tid[i], ret);
// 	}
// 	return 0;
// }


// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	while (1){
// 		sleep(1);
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 	}
// 	return (void*)0;
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	sleep(1);
//  	printf("\n main thread quit !!! \n");

// 	return 0;
// }


// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 		int a = 1 / 0; //error
// 	}
// 	return (void*)2022;
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 	for (int i = 0; i < 5; i++){
// 		void* ret = NULL;
// 		pthread_join(tid[i], &ret);
// 		printf("thread %d[%lu]...quit, exitcode: %d\n", i, tid[i], ret);
// 	}
// 	return 0;
// }


// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 	}
// 	return (void*)2022;
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 	for (int i = 0; i < 5; i++){
// 		void* ret = NULL;
// 		pthread_join(tid[i], &ret);
// 		printf("thread %d[%lu]...quit, exitcode: %d\n", i, tid[i], ret);
// 	}
// 	return 0;
// }

/*
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>

void* Routine(void* arg)
{
	char* msg = (char*)arg;
	int count = 0;
	while (count < 5){
		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
		sleep(1);
		count++;
	}
	return NULL;
}
int main()
{
	pthread_t tid[5];
	for (int i = 0; i < 5; i++){
		char* buffer = (char*)malloc(64);
		sprintf(buffer, "thread %d", i);
		pthread_create(&tid[i], NULL, Routine, buffer);
		printf("%s tid is %lu\n", buffer, tid[i]);
	}
	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
	for (int i = 0; i < 5; i++){
		pthread_join(tid[i], NULL);
		printf("thread %d[%lu]...quit\n", i, tid[i]);
	}
	return 0;
}

*/

// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	while (1){
//         sleep(1);
// 		printf("I am %s......pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 	}
// }
// int main()
// {
//     PTHREAD_CANCELED;
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	while (1){
// 		 printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 		 sleep(2);
// 	}
// 	return 0;
// }




// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	while (1){
// 		printf("I am %s......pid: %d, ppid: %d\n", msg, getpid(), getppid());
// 		sleep(1);
// 	}
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 	}
// 	while (1){
// 		printf("I am main thread...pid: %d, ppid: %d\n", getpid(), getppid());
// 		sleep(1);
// 	}
// 	return 0;
// }


// #include <stdio.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	while (1){
// 		printf("I am %s......pid: %d, ppid: %d\n", msg, getpid(), getppid());
// 		sleep(1);
// 	}
// }
// int main()
// {
// 	pthread_t tid;
// 	pthread_create(&tid, NULL, Routine, (void*)"thread 1");
// 	while (1){
// 		printf("I am main thread...pid: %d, ppid: %d\n", getpid(), getppid());
// 		sleep(2);
// 	}
// 	return 0;
// }




// #include <stdio.h>
// #include <pthread.h>
// #include <unistd.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	while (1){
// 		printf("I am %s\n", msg);
// 		sleep(1);
// 	}
// }
// int main()
// {
// 	pthread_t tid;
// 	pthread_create(&tid, NULL, Routine, (void*)"thread 1");
// 	while (1){
// 		printf("I am main thread!\n");
// 		sleep(2);
// 	}
// 	return 0;
// }
